import BASE_URL from '@/api/env.js'; // 引入接口共用地址
import RequestManager from '@/utils/requestManager.js';
import { toast, clearStorageSync, getStorageSync, useRouter } from '@/utils/utils.js';

const manager = new RequestManager();

/**
 * 通用文件上传方法
 * @param {string} url - 文件上传接口地址
 * @param {Object} options - 配置参数
 * @param {string} options.filePath - 要上传的文件路径
 * @param {string} options.name - 文件对应的 key，服务器端通过此 key 获取文件
 * @param {Object} options.formData - 附加的表单数据
 * @param {boolean} options.loading - 是否显示加载动画
 * @returns {Promise}
 */
const uploadFile = async (url, { filePath, name, formData = {}, loading = true }) => {
    let requestId = manager.generateId('upload', url, { filePath, formData });
    if (!requestId) {
        console.log('重复请求');
        return false;
    }

    const header = {};
    header.Authorization = getStorageSync('token') || '';
    console.log(header);

    return new Promise((resolve, reject) => {
        loading && uni.showLoading({ title: '上传中...' });

        uni.uploadFile({
            url: BASE_URL + url,
            filePath: filePath,
            name: name,
            formData: formData,
            header: header,
            timeout: 10000,
            complete: () => {
                uni.hideLoading();
                manager.deleteById(requestId);
            },
            success: (successData) => {
                console.log(successData);
                const res = successData.data;

                try {
                    // 尝试解析返回的数据为 JSON 格式
                    const parsedRes = typeof res === 'string' ? JSON.parse(res) : res;

                    if (successData.statusCode === 200) {
                        // 业务逻辑处理
                        if (parsedRes.code === 401) {
                            // Token 过期，清除存储并跳转到登录页
                            clearStorageSync('token');
                            useRouter('/pages/public/login', 'reLaunch');
                            reject(parsedRes);
                        } else {
                            resolve(parsedRes);
                        }
                    } else {
                        console.log('网络连接失败，请稍后重试', url);
                        toast('网络连接失败，请稍后重试');
                        reject(parsedRes);
                    }
                } catch (err) {
                    console.error('文件上传返回数据解析失败：', err);
                    toast('文件上传失败，请稍后重试');
                    reject(err);
                }
            },
            fail: (err) => {
                console.log("请求：" + BASE_URL + url + '，发生错误：', err);
                toast('文件上传失败，请稍后重试');
                reject(err);
            }
        });
    });
};

export default uploadFile;